package jvm;

/**
 * 虚拟机自带加载器
 *  启动类加载器
 *  扩展类加载器
 *  应用程序类加载器
 *
 *
 * 用户自定义加载器
 *  java.lang.ClassLoader的子类
 *
 *
 *  双亲委派机制
 *      当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,
 *      每一个层次类加载器都如此,因此所有的加载请求都应该传送到启动类加载器中,只有当父类加载器
 *      反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会
 *      尝试自己去加载.
 *      采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器
 *      加载这个类,最终都是委托给顶层的启动类加载器来加载这个类,这样就保证了使用不同的类加载器
 *      最终得到的都是同一个Object对象.
 */
public class MyObject {
    public static void main(String args[]){
        Object object = new Object();
//        System.out.println(object.getClass().getClassLoader().getParent().getParent());
//        System.out.println(object.getClass().getClassLoader().getParent());
        System.out.println(object.getClass().getClassLoader());

        MyObject myObject = new MyObject();
        System.out.println(myObject.getClass().getClassLoader().getParent().getParent());
        System.out.println(myObject.getClass().getClassLoader().getParent());
        System.out.println(myObject.getClass().getClassLoader());
    }
}
